package br.com.treinamento.gestaoExperienciaProfissional.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.model.DualListModel;

import br.com.treinamento.gestaoExperienciaProfissional.model.Grupo;
import br.com.treinamento.gestaoExperienciaProfissional.model.Permissao;
import br.com.treinamento.gestaoExperienciaProfissional.service.GrupoService;
import br.com.treinamento.gestaoExperienciaProfissional.service.PermissaoService;
import br.com.treinamento.gestaoExperienciaProfissional.util.FacesUtil;

import com.google.common.base.Strings;

@ManagedBean
@ViewScoped
public class GrupoController implements Serializable {

	private static final long serialVersionUID = 8301865434469950945L;

	private GrupoService grupoService = new GrupoService();
	private PermissaoService permissaoService = new PermissaoService();
	private Grupo grupo;
	private List<Grupo> grupos;

	private DualListModel<Permissao> permissoes;

	@PostConstruct
    public void init() {
    	String idGrupo = FacesUtil.getRequestParameter("idGrupo");
    	if(!Strings.isNullOrEmpty(idGrupo)) {
    		alterarGrupo(idGrupo);
    	} else {
    		novoGrupo();
    	}        	
    }

	private void novoGrupo() {
		grupo = new Grupo();
		inicializarPermissoes();
	}

	private void alterarGrupo(String idGrupo) {
		Integer id = Integer.valueOf(idGrupo);
		grupo = grupoService.buscar(id);
		inicializarPermissoesAlteracao();
	}

	private void inicializarPermissoes() {
		permissoes = new DualListModel<Permissao>(permissaoService.listar(), new ArrayList<Permissao>());
	}
	
	private void inicializarPermissoesAlteracao() {
		List<Permissao> permissoesSelecionadas = grupo.getPermissoes();
		List<Permissao> permissoesNaoSelecionadas = permissaoService.listar();
		permissoesNaoSelecionadas.removeAll(permissoesSelecionadas);
		
		permissoes = new DualListModel<Permissao>(permissoesNaoSelecionadas, permissoesSelecionadas);
	}

	public String salvar() {
		grupo.setPermissoes(permissoes.getTarget());
		grupoService.salvar(grupo);
		FacesUtil.mostrarMensagemSucesso("grupo.incluido.sucesso");
		return "/paginas/grupo/listarGrupo";
	}
	
	public void excluir(Grupo g){
    	grupoService.excluir(g);
    	atualizarGrupos();
    	FacesUtil.mostrarMensagemSucesso("grupo.excluido.sucesso");
    }
	
	public String atualizar() {   
		grupo.setPermissoes(permissoes.getTarget());
		grupoService.atualizar(grupo);
    	FacesUtil.mostrarMensagemSucesso("grupo.alterar.sucesso");
    	return "/paginas/grupo/listarGrupo";
    }
	
	private void atualizarGrupos() {
		setGrupos(grupoService.listar());
	}

	public Grupo getGrupo() {
		return grupo;
	}

	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}

	public DualListModel<Permissao> getPermissoes() {
		return permissoes;
	}

	public void setPermissoes(DualListModel<Permissao> permissoes) {
		this.permissoes = permissoes;
	}

	public List<Grupo> getGrupos() {
		if(grupos == null){
			atualizarGrupos();
		}
		return grupos;
	}

	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}

}
